<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- 到家的最少跳跃次数 -->
    <script>
      var minimumJumps = function (forbidden, a, b, x) {
        forbidden = new Set(forbidden)
        // 分别是[当前的位置，步数，上一次是否向左跳过]
        let nodes = [[0, 0, false]]
        while (nodes.length) {
          let [node, level, jumpLeft] = nodes.shift()
          if (forbidden.has(node) || node < 0 || node > 5999) continue
          //把访问过的位置加过forbidden，防止当a === b 时且x到达不了时造成的死循环
          forbidden.add(node)
          //第一次访问到x时的步数一定是最少的
          if (node === x) {
            return level
          }
          //题目说明了不能连续向左跳，但连续向右跳是允许的，而因此会导致无限向右跳，所以应该先搜索向左跳的情况，再搜索向右跳，也就是先考虑node - b，再考虑node + a
          if (!jumpLeft) {
            nodes.push([node - b, level + 1, true])
          }
          nodes.push([node + a, level + 1, false])
        }
        return -1
      }
      console.log(minimumJumps([14, 4, 18, 1, 15], 3, 15, 9))
    </script>
  </body>
</html>
